<?php

require_once('DbConnection.php');
require_once('DATA.php');
require_once('Utils.php');
/**
 *
 * @author rodolfoflorentin@gmail.com
 * @version 10-2011
 */
class Base
{
    /**
     *
     * @var DbConnection
     */
    public $conexion;
    /**
     *
     * @var type 
     */
    private $_tableName = NULL;
    /**
     *
     * @var type 
     */
    private $_fieldIdName = NULL;
    /**
     *
     * @var array
     */
    private $_excluirArray;
	
	protected $_data;
    /**
     * 
     */
    public function  __construct()
    {
        $this->conexion = new DbConnection();
		$this->_data = new DATA();
        $this->_excluirArray = array('conexion','_tableName', '_fieldIdName','_excluirArray','_data');
    }

    /**
     * Agrega una variable en el array de variables a excluir para no insertar y actualizarse automaticamente.
     * @param string $variable
     */
    protected function addToExcluirVariable($variable)
    {
        $this->_excluirArray[] = $variable;
    }
    /**
     *
     * @return string El nombre de la tabla a utilizar en la consulta sql. 
     */
    public function getTableName()
    {	
        return $this->_tableName;        
    }
    /**
     *
     * @param string $tableName El nombre de la tabla a utilizar en la consulta sql. 
     */
    public function setTableName($tableName)
    { 
        $this->_tableName = $tableName;         
    }
    /**
     *
     * @return type 
     */
    public function getFieldIdName()
    { 
        return $this->_fieldIdName; 
    }
    /**
     *
     * @param type $fieldIdName 
     */
    public function setFieldIdName($fieldIdName)
    { 
        $this->_fieldIdName = $fieldIdName;        
    }
    
    /**
     *
     * @param type $atributo
     * @return type 
     */
    public function atributoPermitido($atributo)
    {
        if(substr_count(strtolower($atributo), 'array') > 0 ) return FALSE;
        
        return !in_array($atributo, $this->_excluirArray);
    }
    
    /**
     *
     * @param type $operacion
     * @param array $opciones Las opciones para la query a desarrollar.
     * @return string 
     */
    public function getSQL($operacion='',$opciones=array())
    {
        $sql = '';
        switch ($operacion) {
            case 'INSERT':
                        $sql .= "INSERT INTO ".$this->getTableName()." ("; 
                        foreach ($this as $atributo => $valor) {
                                if($atributo != $this->getFieldIdName() && isset($valor) && $this->atributoPermitido($atributo)) {
                                    $sql .= $atributo.', '; 
                                }
                        }
                        $sql = substr($sql, 0, -2);
                        $sql .= ") VALUES (";
                        foreach ($this as $atributo => $valor) {
                                if($atributo != $this->getFieldIdName() && isset($valor) && $this->atributoPermitido($atributo)) {
                                    $sql .= "'".Utils::escape($valor)."',";
                                }
                        }
                        $sql = substr($sql, 0, -1);
                        $sql .= ")";                        
                break;
             case 'UPDATE':
 
                        $sql .= "UPDATE ".$this->getTableName()." SET ";
                        foreach ($this as $atributo => $valor) {
                                if($atributo != $this->getFieldIdName() && isset($valor) && $this->atributoPermitido($atributo)) {
                                    $sql .= $atributo. "='".Utils::escape($valor)."'"  . ', ';
                                }
                        }
                        $sql = substr($sql, 0, -2);
                        if($opciones['where'] != ''){
                            $sql .= " WHERE ".$opciones['where'];
                        }
                break;
            case 'SELECT':
                        $sql .= "SELECT * FROM ".$this->getTableName()." ";
                        if($opciones['where'] != ''){
                            $sql .= " WHERE ".$opciones['where'];
                        }
                        if($opciones['order']!=''){
                            $sql .= " ORDER BY ".$opciones['order']."  ";
                        }
                        if(isset($opciones['pagina']) && $opciones['pagina'] != -1 ){
                            $sql .= " LIMIT ".(Utils::escape($opciones['pagina'])*$this->_data->PAGINADO). " , ".($this->_data->PAGINADO);
                        }                        
                break;
            case 'COUNT':
                        $sql .= "SELECT COUNT(*) as cantidadRegistros FROM ".$this->getTableName()." ";
                         if($opciones['where'] != ''){
                            $sql .= " WHERE ".$opciones['where'];
                        }
                break;
            case 'DELETE':
                        $sql .= "DELETE FROM ".$this->getTableName()." ";
                        if($opciones['where'] != ''){
                            $sql .= " WHERE ".$opciones['where'];
                        }
                break;
            default:
                break;
        }
        return $sql;
    }
    /**
     * 
     */
    public function insertar()
    {
        $query = $this->getSQL('INSERT');
        $result = $this->conexion->makeQuery($query);
        if($result){
            $result = $this->conexion->getInsertedId();
        }
        return $result;
    }        
     /**
      * Obtiene una lista de resultados de la base de datos.
      * @param int $pagina
      * @param string $order nombredecampo ASC|DESC
      * @param string $where nombredecampo=valor
      * @return array
      */
    public function seleccionar($pagina=-1,$order='',$where='')
    {
        $query = $this->getSQL('SELECT',array('pagina'=>$pagina,'order'=>$order,'where'=>$where));
        $result = $this->conexion->makeQuery($query);
        $resultados = $this->conexion->getResultArray();    
        return $resultados;
    }

    /**
      * Obtiene una lista de resultados de la base de datos.
      * @param int $pagina
      * @param string $order
      * @return Object
      */
    public function getDataPorWhere($where)
    {
        $query = $this->getSQL('SELECT',array('where'=>$where));
        $result = $this->conexion->makeQuery($query);
        //echo $query;
        $resultado = $this->conexion->nextRowObject(get_class($this));        
        return $resultado;
    }


    /**
      * Obtiene una lista de resultados de la base de datos.
      * @param int $pagina
      * @param string $order
      * @return array
      */
    public function getDataPorWhereArray($where)
    {
        $query = $this->getSQL('SELECT',array('where'=>$where));
        $result = $this->conexion->makeQuery($query);

        $resultado = $this->conexion->nextRow(get_class($this));
        return $resultado;
    }

     /**
      * Actualiza los datos para un registro en la base de datos.
      * @param string $where La condicion para actualizar un registro.
      * @return bool
      */
    public function actualizar($where)
    {
        $query = $this->getSQL('UPDATE',array('where'=>$where));
        $result = $this->conexion->makeQuery($query);        
        return $result;
    }

    /**
      * Borra los datos  en la base de datos de acuerdo al where.
      * @param string $where La condicion para borrar.
      * @return bool
      */
    public function borrar($where)
    {
        $query = $this->getSQL('DELETE',array('where'=>$where));
        $result = $this->conexion->makeQuery($query);
        return $result;
    }
    /**
     *
     * @return  
     */
    public function cantidadRegistros($where='')
    {
        $query = $this->getSQL('COUNT',array('where'=>$where));
        $result = $this->conexion->makeQuery($query);
        $resultados = $this->conexion->nextRow();        
        return $resultados['cantidadRegistros'];
    }
}

?>
